PostgreSQL pg_stat_statements pg_stat_statements 视图
1 背景知识
通过 pg_stat_statements 视图可以查看收集的统计信息。
此视图包括 数据库 ID
、用户 ID
和 查询 ID
(每个语句)的组合都包含一行。
2 视图定义
列类型 | 说明 |
---|---|
userid oid (references pg_authid.oid) | 执行该语句的用户的 OID |
dbid oid (references pg_database.oid) | 在其中执行该语句的数据库的 OID |
queryid bigint | 内部哈希码,从语句的解析树计算得来 |
query text | 查询文本 |
plans bigint |
计划语句的次数(如果未启用pg_stat_statements.track_planning ,则为零) |
total_plan_time double precision |
计划语句所花费的总时间,以毫秒为单位(如果未启用pg_stat_statements.track_planning ,则为零) |
min_plan_time double precision |
计划语句所花费的最短时间,以毫秒为单位(如果未启用pg_stat_statements.track_planning ,则为零) |
max_plan_time double precision |
计划语句所花费的最长时间,以毫秒为单位(如果未启用pg_stat_statements.track_planning ,则为零) |
mean_plan_time double precision |
计划语句所花费的平均时间,以毫秒为单位(如果未启用pg_stat_statements.track_planning ,则为零) |
stddev_plan_time double precision |
计划语句花费的时间的总体标准偏差,以毫秒为单位(如果未启用pg_stat_statements.track_planning ,则为零) |
calls bigint |
语句被执行的次数 |
total_exec_time double precision |
执行语句所花费的总时间,以毫秒为单位 |
min_exec_time double precision |
执行语句所花费的最短时间,以毫秒为单位 |
max_exec_time double precision |
执行语句所花费的最长时间,以毫秒为单位 |
mean_exec_time double precision |
执行语句的平均时间,以毫秒为单位 |
stddev_exec_time double precision |
执行语句花费的时间的总体标准偏差,以毫秒为单位 |
rows bigint |
语句检索或影响的总行数 |
shared_blks_hit bigint |
语句的共享块缓存命中总数 |
shared_blks_read bigint |
语句读取的共享块总数 |
shared_blks_dirtied bigint |
被语句弄脏的共享块总数 |
shared_blks_written bigint |
语句写入的共享块总数 |
local_blks_hit bigint |
语句的本地块缓存命中总数 |
local_blks_read bigint |
语句读取的本地块总数 |
local_blks_dirtied bigint |
被语句弄脏的本地块总数 |
local_blks_written bigint |
语句写入的本地块总数 |
temp_blks_read bigint |
语句读取的临时块总数 |
temp_blks_written bigint |
语句写入的临时块总数 |
blk_read_time double precision |
语句读取块所花费的总时间,以毫秒为单位(如果未启用了track_io_timing ,则为零) |
blk_write_time double precision |
语句写入块所花费的总时间,以毫秒为单位(如果未启用了track_io_timing ,则为零) |
wal_records bigint |
语句生成的 WAL 记录总数 |
wal_fpi bigint |
语句生成的 WAL 整页图像总数 |
wal_bytes numeric |
语句生成的 WAL 字节总数 |
出于安全性考虑,只有 SuperUser
和授予pg_read_all_stats 角色的成员,允许看到其他用户执行的查询的 SQL 文本或者 queryid
。
查询的执行计划(即 SELECT
、INSERT
、UPDATE
以及 DELETE
)根据哈希计算计算后具有相同的查询结构,就会在 pg_stat_statements 视图中显示一行,反之则会显示多行。
这样做的目的是为了能够使两个查询尽可能使两个查询相同,不会由于文本常量值不同而不同。不过,其他命令会严格地以它们的文本查询字符串为基础进行比较。
在 pg_stat_statements 视图 文本常量值常会显示为一个参数符号,比如 $1
所替换。查询语句的剩余文本显示在 pg_stat_statements 视图 中的 query
字段中。
由于 queryid
哈希值是根据查询被解析和分析后的表达计算的,对立的情况也可能存在:如果具有相同文本的查询由于参数(如不同的 search_path
设置)的原因而具有不同的含义,它们就可能作为不同的项存在。
在使用 pg_stat_statements 视图过程中尽量使用使用 dbid
和 userid
组合作为一个筛选条件比 query
更方便。
使用 queryid
字段也可以精确查找相关信息。但是,比较遗憾的是,对于 queryid
哈希值的可靠性并不那么稳定。
其次 queryid
是从分析树得来的,它的值是以这种形式出现的内部对象标识符的函数。这对于用户完全无意义。